#pragma once
#ifndef _WRD_STACK__HPP
#define _WRD_STACK__HPP

#include <wrdc.h>
#define __WRD__DEBUG 1
#include <wrdbg.h>

#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
#define STACK_NODE_POP_REMAIN

#ifndef __STACK__ELEM
#include "cstr.h"
#define stack_elem_t cstr_t
#endif  // __STACK__ELEM

typedef struct stack_node_s {
    stack_elem_t *data;
    struct stack_node_s *next;
} stack_node_t;

typedef struct stack_s{
    stack_node_t *base;
    stack_node_t *top;  // 指向一个空的、待写入元素
    int length;
    int size;
} stack_t;

stack_t stack_init(int size);

stack_t stack();

int stack_len(stack_t s);

void debug_stack(stack_t s);

void stack_push(stack_t *s, stack_elem_t *data);

stack_elem_t stack_pop(stack_t *s);

void stack_free(stack_t *s);

#endif  // _WRD_STACK__HPP